#ifndef MODBUS_GLOBAL_H_
#define MODBUS_GLOBAL_H_

#include "../DATA_Function.h"

/*宏定义*/
//< MODBUS485通讯协议下功能码1、2请求报文长度为固定值8，该功能码最多可一次读取2000个线圈的值，因此回复报文长度定为300可满足需求
#define MODBUS485_FUNC0x01_0x02_REQUEST_PCK_MAXNUM	8			//< 功能码1请求报文数据包最大长度（主站）
#define MODBUS485_FUNC0x01_0x02_RESPOND_PCK_MAXNUM	300			//< 功能码1回复报文数据包最大长度（从站）

//< MODBUS485通讯协议下功能码3、4请求报文长度为固定值8，该功能码最多可一次读取125个寄存器的值，因此回复报文长度定为300可满足需求
#define MODBUS485_FUNC0x03_0x04_REQUEST_PCK_MAXNUM	8			//< 功能码3请求报文数据包最大长度（主站）
#define MODBUS485_FUNC0x03_0x04_RESPOND_PCK_MAXNUM	300			//< 功能码3回复报文数据包最大长度（从站）

//< MODBUS485通讯协议下功能码5请求报文长度为固定值8，该功能码回复报文格式与请求报文完全相同，因此也固定为8字节
#define MODBUS485_FUNC0x05_REQUEST_PCK_MAXNUM	8			//< 功能码5请求报文数据包最大长度（主站）
#define MODBUS485_FUNC0x05_RESPOND_PCK_MAXNUM	8			//< 功能码5回复报文数据包最大长度（从站）

//< MODBUS485通讯协议下功能码6请求报文长度为固定值8，该功能码回复报文格式与请求报文完全相同，因此也固定为8字节
#define MODBUS485_FUNC0x06_REQUEST_PCK_MAXNUM	8			//< 功能码6请求报文数据包最大长度（主站）
#define MODBUS485_FUNC0x06_RESPOND_PCK_MAXNUM	8			//< 功能码6回复报文数据包最大长度（从站）

//< MODBUS485通讯协议下功能码15最多可一次写入1968个线圈的值请，求报文长度为300可满足需求，回复报文长度为固定值8
#define MODBUS485_FUNC0x0F_REQUEST_PCK_MAXNUM	300			//< 功能码15请求报文数据包最大长度（主站）
#define MODBUS485_FUNC0x0F_RESPOND_PCK_MAXNUM	8			//< 功能码15回复报文数据包最大长度（从站）

//< MODBUS485通讯协议下功能码16最多可一次写入120个寄存器的值请，求报文长度为300可满足需求，回复报文长度为固定值8
#define MODBUS485_FUNC0x10_REQUEST_PCK_MAXNUM	300			//< 功能码16请求报文数据包最大长度（主站）
#define MODBUS485_FUNC0x10_RESPOND_PCK_MAXNUM	8			//< 功能码16回复报文数据包最大长度（从站）

//< MODBUSTCP通讯协议下功能码1、2请求报文长度为固定值14，该功能码最多可一次读取2000个线圈的值，因此回复报文长度定为300可满足需求
#define MODBUSTCP_FUNC0x01_0x02_REQUEST_PCK_MAXNUM	12			//< 功能码1请求报文数据包最大长度（主站）				//< duan 191108 由14修改为12
#define MODBUSTCP_FUNC0x01_0x02_RESPOND_PCK_MAXNUM	300			//< 功能码1回复报文数据包最大长度（从站）

//< MODBUSTCP通讯协议下功能码3、4请求报文长度为固定值14，该功能码最多可一次读取125个寄存器的值，因此回复报文长度定为300可满足需求
#define MODBUSTCP_FUNC0x03_0x04_REQUEST_PCK_MAXNUM	12			//< 功能码3请求报文数据包最大长度（主站）				//< duan 191108 由14修改为12
#define MODBUSTCP_FUNC0x03_0x04_RESPOND_PCK_MAXNUM	300			//< 功能码3回复报文数据包最大长度（从站）

//< MODBUSTCP通讯协议下功能码5请求报文长度为固定值14，该功能码回复报文格式与请求报文完全相同，因此也固定为14字节
#define MODBUSTCP_FUNC0x05_REQUEST_PCK_MAXNUM	12			//< 功能码5请求报文数据包最大长度（主站）					//< duan 191108 由14修改为12
#define MODBUSTCP_FUNC0x05_RESPOND_PCK_MAXNUM	12			//< 功能码5回复报文数据包最大长度（从站）					//< duan 191108 由14修改为12

//< MODBUSTCP通讯协议下功能码6请求报文长度为固定值14，该功能码回复报文格式与请求报文完全相同，因此也固定为14字节
#define MODBUSTCP_FUNC0x06_REQUEST_PCK_MAXNUM	12			//< 功能码6请求报文数据包最大长度（主站）					//< duan 191108 由14修改为12
#define MODBUSTCP_FUNC0x06_RESPOND_PCK_MAXNUM	12			//< 功能码6回复报文数据包最大长度（从站）					//< duan 191108 由14修改为12

//< MODBUSTCP通讯协议下功能码15最多可一次写入1968个线圈的值请，求报文长度为300可满足需求，回复报文长度为固定值14
#define MODBUSTCP_FUNC0x0F_REQUEST_PCK_MAXNUM	300			//< 功能码15请求报文数据包最大长度（主站）
#define MODBUSTCP_FUNC0x0F_RESPOND_PCK_MAXNUM	12			//< 功能码15回复报文数据包最大长度（从站）				//< duan 191108 由14修改为12

//< MODBUSTCP通讯协议下功能码16最多可一次写入120个寄存器的值请，求报文长度为300可满足需求，回复报文长度为固定值14
#define MODBUSTCP_FUNC0x10_REQUEST_PCK_MAXNUM	300			//< 功能码16请求报文数据包最大长度（主站）
#define MODBUSTCP_FUNC0x10_RESPOND_PCK_MAXNUM	12			//< 功能码16回复报文数据包最大长度（从站）				//< duan 191108 由14修改为12

#define HIGH_CHAR(name)	((unsigned char)((name) >> 8))				//< 获取高字节
#define LOW_CHAR(name)	((unsigned char)((name) & 0x00FF))			//< 获取低字节

/*函数*/
unsigned short CRC_Check(unsigned char* Buf, int iLen);					//< CRC-16校验程序
unsigned short CRC16(unsigned short crc, int c);
#endif
